package com.arquitecturajava;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

public class dataBaseHelper<T> {

	/**
	 * @author      cecilio alvarez caules contacto@arquitecturajava.com
	 * @version     1.0                        
	 */
	private static final String DRIVER = "com.mysql.jdbc.Driver";
	private static final String URL = "jdbc:mysql://localhost/arquitecturajava";
	private static final String USUARIO = "root";
	private static final String CLAVE = "java";

	public int modificarRegistro(String consultaSQL)  {

		Connection conexion = null;
		Statement sentencia = null;

		int filasAfectadas = 0;

		try {

			Class.forName(DRIVER);

			conexion = DriverManager.getConnection(URL, USUARIO, CLAVE);

			sentencia = conexion.createStatement();

			filasAfectadas = sentencia.executeUpdate(consultaSQL);

		} catch (ClassNotFoundException e) {

			System.out.println("Error de acceso al driver" + e.getMessage());
		} catch (SQLException e) {

			System.out.println("Error de SQL" + e.getMessage());
		} finally {

			if (sentencia != null) {

				try {sentencia.close();} catch (SQLException e) {}
				
			}
			if (conexion != null) {

				try {conexion.close();} catch (SQLException e) {}
			}

		}

		return filasAfectadas;

	}

	
	

	
	@SuppressWarnings("unchecked")
	public List<T> seleccionarRegistros(String consultaSQL,Class<T> clase)   {

		Connection conexion = null;
		Statement sentencia = null;
		ResultSet filas = null;
		ArrayList<T> listaDeObjetos=new ArrayList<T>();
		

			try {
				Class.forName(DRIVER);
				conexion = DriverManager.getConnection(URL, USUARIO, CLAVE);
				sentencia = conexion.createStatement();
				filas = sentencia.executeQuery(consultaSQL);
				
				while (filas.next()) {

					T objeto=(T) clase.newInstance();
					
							
					Method[] metodos=objeto.getClass().getDeclaredMethods();
					
						for (int i=0;i<metodos.length;i++) {
						

						if (metodos[i].getName().startsWith("set") ) {
							
							metodos[i].invoke(objeto, filas.getString(metodos[i].getName().substring(3)));
						}
						
						if (objeto.getClass().getName().equals("java.lang.String")) {
							
							objeto=(T)filas.getString(1);
							
						}
						
					
						
					}
					listaDeObjetos.add(objeto);
				}
			} catch (SecurityException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
	
			} catch (ClassNotFoundException e) {
				
				e.printStackTrace();
		
			} catch (SQLException e) {
				// TODO Auto-generated catch block
			} catch (InstantiationException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
			
			}
			
		
		return listaDeObjetos;

	
	}
	
	


	}
